package netty.handler;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * @author ：朱博
 * @description：自定义Handler，使用 @{ChannelInboundHandlerAdapter}
 * @date ：2021/4/12 23:36
 */
public class NettyClientHandler extends ChannelInboundHandlerAdapter {

    /**
     * 当通道就绪就会触发此方法
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx);

        ctx.writeAndFlush(Unpooled.copiedBuffer(
                "你好Server，我是馍馍，我在是哟个Netty给你发送消息",
                CharsetUtil.UTF_8));
    }

    /**
     * 根据实际数据（这里我们可以读取客户端的发送信息）
     * @param ctx 上下文对象 其中含有管道 【channel】和 通道 【pipeline】 连接地址 ...一系列连接的地址
     * @param msg 客户端发送的数据
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("server ctx = " + ctx);
        /*
         * 由于Nio的原理是数据是在 Buffer 里面的 ，所以把msg转换为 buffer 类型效率比较高
         */
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println("server address : "+
                ctx.channel().remoteAddress()+
                "server received was message :" +
                byteBuf.toString(CharsetUtil.UTF_8));

    }


    /**
     * 处理异常的方法
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();//如果发送异常，那么就关闭通道
    }
}
